﻿package aidn.animation.text 
{
	import aidn.animation.utils.Hide;
	import caurina.transitions.properties.FilterShortcuts;
	import caurina.transitions.Tweener;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.filters.BlurFilter;
	
	/**
	 * テキストMC
	 */
	public class TextMc extends Sprite
	{
		private var _tx :Text;
		
		private var _rx :Number;
		private var _ry :Number;
		private var _rz :Number;
		
		private var _zoom :Number;
		
		
		public function TextMc( px :int = 0, py :int = 0, scale :Number = 1.0 ) 
		{
			x = px;
			y = py;
			scaleX = scaleY = scale;
			
			FilterShortcuts.init();
		}
		
		/**
		 * テキストをセットします。
		 * @param	text
		 * @param	font
		 * @param	color
		 * @param	size
		 * @param	letterSp
		 */
		public function setText ( text :String, font :String = null, color :int = 0, size :int = 16, letterSp :Number = 1.0 ) 
		{
			_tx = new Text( font, color, size, letterSp );
			_tx.text = text;
			
			_tx.x = - _tx.width  / 2;
			_tx.y = - _tx.height / 2;
			
			addChild( _tx );
		}
		
		/**
		 * 回転&ズーム運動を開始します(ENTER_FRAME)。
		 * @param	rx		rotationX
		 * @param	ry		rotationY
		 * @param	rz		rotationZ
		 * @param	zoom	scaleX, scaleY
		 */
		public function rotationStart ( rx :Number = 0, ry :Number = 0, rz :Number = 0, zoom :Number = 0 ) :void
		{
			_rx = rx;
			_ry = ry;
			_rz = rz;
			
			_zoom = zoom;
			
			removeEventListener( Event.ENTER_FRAME, _enterFrame );
			addEventListener( Event.ENTER_FRAME, _enterFrame );
		}
		/**
		 * 回転&ズーム運動を停止します。
		 */
		public function rotationStop (  ) :void
		{
			removeEventListener( Event.ENTER_FRAME, _enterFrame );
		}
		
		/**
		 * フェードイン → 静止 → フェードアウト の一連のモーションを開始します。
		 * @param	time	表示されている時間。
		 * @param	time2	フェードイン/アウトに掛ける時間。
		 * @param	blur	ぼかし。
		 */
		public function motionStart ( time :Number = 1.0, time2 :Number = 0.5, blur :Number = 5 ) :void
		{
			fade( "in", time2, blur );
			
			Tweener.addTween( this, { delay : time2 + time, onComplete :
				function ( ) :void
				{
					fade( "out", time2, blur );
				}} );
		}
		
		/**
		 * 破棄します。
		 */
		public function kill ( ) :void
		{
			// 破棄
			Tweener.removeTweens( this );
			removeEventListener( Event.ENTER_FRAME, _enterFrame );
			
			Hide.start( this );		//////
			
			var m :* = this;
			m.parent.removeChild( m );
			m = null;
		}
		
		/**
		 * フェードを行います。
		 * @param	type	フェードイン/アウト("in" or "out")。
		 * @param	time	時間。
		 * @param	blur	ぼかし。
		 */
		public function fade ( type :String = "in", time :Number = 1.0, blur :Number = 3 ) :void
		{
			if ( type == "in" )
			{
				alpha = 0;
				
				filters = [ new BlurFilter( blur, blur ) ];
				Tweener.addTween( this, {  alpha: 1, _Blur_blurX: 0, _Blur_blurY: 0, time: time, transition: "linear" } );
			}
			else
			{
				Tweener.addTween( this, {  alpha: 0, _Blur_blurX: blur, _Blur_blurY: blur, time: time, transition: "linear",
					onComplete :function ( ) :void
					{
						this.kill();
					} } );
			}
		}
		
		/* ENTER FRAME */
		private function _enterFrame ( evt :Event ) :void
		{
			rotationX += _rx;
			rotationY += _ry;
			rotationZ += _rz;
			
			scaleX += _zoom;
			scaleY += _zoom;
		}
	}
}